[小ネタ]AWS Lambda(Node.js)から別リージョンのSNSへPublish(APIをCall)する方法
AWS事業本部の梶原@福岡です。
連続して小ネタですが、Labmda(Node.js)から、別のリージョンのSNSに対してPublishしていて、以下のエラーがでて小ハマりしたので共有します。
{ "errorMessage": "Invalid parameter: TopicArn", "errorType": "InvalidParameter", "stackTrace": [ "Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/query.js:50:29)", 省略 ] }
コードは
var params = { Message: message, Subject: subject, TopicArn: topicArn }; var sns = new AWS.SNS(); var result = await sns.publish(params).promise(); // 当たり前ですけどこでエラー
になります、わかってる人は単純だとおもうのですが、Lambdaに権限もついてるし、(権限がない場合はerrorType: AuthorizationError
になります)
トピックの指定の仕方が違うのかといろいろしてみたのですが、エラーは解決せず。じゃあどうすりゃいいん?と、若干途方に暮れ、もしかしてLambdaから別のリージョンのSNSへpublishできない?とか思ったのですがそんなことは無く
別のリージョンのSNSを呼び出す場合、SNSのクライアントの初期化時にリージョンを指定して、Publish呼び出しを行うことが必要でした。
var params = { Message: message, Subject: subject, TopicArn: topicArn // arn:aws:sns:us-east-1:XXXXXXXXXX:cm-hoge-topic }; var SNS_REGION = topicArn.split(":")[3]; // topicのARN文字列からリージョンを取得しています var sns = new AWS.SNS({region: SNS_REGION}); var result = await sns.publish(params).promise();
とすれば、特に問題なく、別リージョンのSNSにPublishを実施することができました。 SNSに限らず、他のAPIコールも基本的に同じだと思うので、小ハマりした人は試してみてください。 以上超小ネタでした。
参考
AWSJavaScriptSDK(SNS) https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SNS.html#constructor-property
AWS ドキュメント » JavaScript SDK » SDK v2 開発者ガイド » SDK for JavaScript の設定 » AWS リージョンの設定 AWS リージョンの設定 https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-region.html